﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Business.Entities;
using Business.Logic;

namespace UI.Desktop
{
    public partial class PlanesDesktop : ApplicationForm
    {
        private List<Especialidad> _ListaEspecialidad;

        public List<Especialidad> ListaEspecialidad
        {
            get { return _ListaEspecialidad; }
            set { _ListaEspecialidad = value; }
        }

        private Plan _PlanActual=new Plan();

        private Plan PlanActual
        {
            get 
            { 
                return _PlanActual; 
            }
            set { _PlanActual=value;}
        }

        #region Constructores

        public PlanesDesktop()
        {
            InitializeComponent();
        }
        

        //dar alta a una Materia
        public PlanesDesktop(ModoForm modo, List<Especialidad> Lista): this()
        {
            ListaEspecialidad = Lista;
            this.Modo = modo;
            MapearDeDatos();
        }

        //modificar o eliminar Materia
        public PlanesDesktop(int ID, ModoForm modo, List<Especialidad> Lista): this()
        {
            try
            {
                ListaEspecialidad = Lista;
                this.Modo = modo;
                PlanesLogic Planlog = new PlanesLogic();
                PlanActual = Planlog.GetOne(ID);
                MapearDeDatos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                this.Close();
            }
        }

        #endregion

        #region Eventos

        private void ABMCPlanes_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'tp2_netDataSet.planes' Puede moverla o quitarla según sea necesario.
            //this.planesTableAdapter.Fill(this.tp2_netDataSet.planes);

            foreach (Especialidad es in ListaEspecialidad)
            {
                cmbIdEspecialidad.Items.Add(es.Descripcion);
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Modo != ModoForm.Consulta)
                {
                    if (Validar() != false)
                    {
                        MapearADatos();
                        GuardarCambios();
                        switch (Modo)
                        {
                            case ModoForm.Alta:
                                MessageBox.Show("El plan fue registrado correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                break;
                            case ModoForm.Modifica:
                                MessageBox.Show("El plan fue modificado correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                                break;
                            case ModoForm.Baja:
                                MessageBox.Show("El plan fue eliminado correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                                break;
                        }
                        btnCancelar.Text = "Cerrar";
                    }
                }
                else
                {
                    MapearADatos();
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion

        #region Métodos

        protected override void MapearDeDatos()
        {
            if (ModoForm.Alta != this.Modo)
            {
                this.txtID.Text = Convert.ToString(PlanActual.ID);
                this.txtDescripcion.Text = PlanActual.Descripcion;
                this.cmbIdEspecialidad.Text = BuscarEspecialidad();
            }
            switch (this.Modo)
            {
                case ModoForm.Alta: btnAceptar.Text = "Guardar";
                    break;
                case ModoForm.Baja: btnAceptar.Text = "Eliminar";
                    txtDescripcion.ReadOnly = true;
                    txtID.ReadOnly = true;
                    cmbIdEspecialidad.Enabled = false;
                    break;
                case ModoForm.Modifica: btnAceptar.Text = "Guardar Cambios";
                    break;
                case ModoForm.Consulta: btnAceptar.Text = "Aceptar";
                    txtDescripcion.ReadOnly = true;
                    txtID.ReadOnly = true;
                    cmbIdEspecialidad.Enabled = false;
                    break;
            }
        }

        private string BuscarEspecialidad()
        {
            string DescEsp = "";
            foreach (Especialidad es in ListaEspecialidad)
            {
                if (PlanActual.IDEspecialidad == es.ID)
                {
                    DescEsp = es.Descripcion;
                }
            }
            return DescEsp;
        }

        private int BuscarIdEspecialidad()
        {
            int idEspecialidad = 0;
            foreach (Especialidad e in ListaEspecialidad)
            {
                if (cmbIdEspecialidad.Text.Trim() == e.Descripcion)
                {
                    idEspecialidad = e.ID;
                }
            }
            return idEspecialidad;
        }

        protected override void MapearADatos()
        {
            try
            {
                switch (Modo)
                {
                    case ModoForm.Alta:
                        Plan plan = new Plan();
                        plan.Descripcion = txtDescripcion.Text.Trim();
                        plan.IDEspecialidad = BuscarIdEspecialidad();
                        plan.State = Plan.States.New;
                        PlanActual = plan;
                        break;

                    case ModoForm.Consulta:
                        PlanActual.ID = Convert.ToInt32(txtID.Text.Trim());
                        PlanActual.Descripcion = txtDescripcion.Text;
                        PlanActual.IDEspecialidad = BuscarIdEspecialidad();
                        PlanActual.State = Materias.States.Unmodified;
                        break;

                    case ModoForm.Modifica:
                        PlanActual.ID = Convert.ToInt32(txtID.Text.Trim());
                        PlanActual.Descripcion = txtDescripcion.Text;
                        PlanActual.IDEspecialidad = BuscarIdEspecialidad();
                        PlanActual.State = Materias.States.Modified;
                        break;

                    case ModoForm.Baja:
                        PlanActual.ID = Convert.ToInt32(txtID.Text.Trim());
                        PlanActual.State = Materias.States.Deleted;
                        break;
                }
            }
            catch (FormatException fe)
            {
                throw fe;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected override void GuardarCambios()
        {
            try
            {
                PlanesLogic PlanLogic = new PlanesLogic();
                if (this.Modo != ModoForm.Baja)
                    PlanLogic.Save(PlanActual);
                else
                    PlanLogic.Delete(PlanActual);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected override bool Validar()
        {
            ValidacionesEspeciales val = new ValidacionesEspeciales();
            string mensaje = "";
            if (txtDescripcion.Text == "")
                mensaje += "- Debe completar el campo Descripción" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esSimbolo, txtDescripcion.Text.Trim()))
                mensaje += "- El campo Descripción contiene símbolos" + "\n";
            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtDescripcion.Text.Trim()))
                mensaje += "- El campo Descipción tiene más de 50 caracteres" + "\n";
            if(cmbIdEspecialidad.Text =="")
                mensaje += "- Debe completar el campo Especialidad" + "\n";

            if (mensaje == "")
                return true;
            else
            {
                MessageBox.Show(mensaje, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
        }

        #endregion


    }
}
